package jdk.jdk8.localdate;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalUnit;
import java.util.Date;
import java.util.Objects;

/**
 * java8 LocalDateTime 工具类
 */
public class LocalDateTimeUtils {
    public static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd HH:mm:ss";

    /**
     * 当前时间
     *
     * @return
     */
    public static String nowStr() {
        return format(LocalDateTime.now(),DEFAULT_DATE_PATTERN);
    }

    /**
     * 格式化
     *
     * @param localDateTime:localDateTime
     * @param pattern:时间格式
     * @return
     */
    public static String format(LocalDateTime localDateTime, String pattern) {
        return localDateTime.format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 格式化
     *
     * @param localDateTime : localDateTime
     * @return
     */
    public static String formatAtDefault(LocalDateTime localDateTime) {
        Objects.requireNonNull(localDateTime,"date 不能为空!");
        return localDateTime.format(DateTimeFormatter.ofPattern(DEFAULT_DATE_PATTERN));
    }

    /**
     * 字符串格式解析
     *
     * @param dateStr:时间字符串
     * @param pattern:时间格式
     * @return
     */
    public static LocalDateTime parse(String dateStr, String pattern) {
        return LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * Date转LocalDateTime
     *
     * @param date:date
     * @return
     */
    public static LocalDateTime date2LocalDateTime(Date date) {
        Objects.requireNonNull(date,"date 不能为空!");
        Instant instant = date.toInstant();
        ZoneId zoneId = ZoneId.systemDefault();
        return instant.atZone(zoneId).toLocalDateTime();
    }

    /**
     * LocalDateTime转Date
     *
     * @param localDateTime:localDateTime
     * @return
     */
    public static Date localDateTime2Date(LocalDateTime localDateTime) {
        Objects.requireNonNull(localDateTime,"localDateTime 不能为空!");
        ZoneId zoneId = ZoneId.systemDefault();
        ZonedDateTime zonedDateTime = localDateTime.atZone(zoneId);
        Instant instant = zonedDateTime.toInstant();
        return Date.from(instant);
    }

    /**
     * 计算时间间隔(年、月、日、时、分、秒)
     * 例：计算两个时间相差的天数，取绝对值
     *   LocalDateTime dateTime1 = LocalDateTime.of(2022, 8, 1, 12, 23, 21);
     *   LocalDateTime dateTime2 = LocalDateTime.of(2022, 9, 20, 1, 23, 21);
     *   long between = LocalDateUtils.between(dateTime1, dateTime2, ChronoUnit.DAYS, true);
     *
     * @param localDateTime1: localDateTime1
     * @param localDateTime2: localDateTime2
     * @param temporalUnit : ChronoUnit
     * @return
     */
    public static long between(LocalDateTime localDateTime1,LocalDateTime localDateTime2,TemporalUnit temporalUnit,boolean isAbs) {
        Objects.requireNonNull(localDateTime1,"localDateTime1 不能为空!");
        Objects.requireNonNull(localDateTime2,"localDateTime2 不能为空!");
        Objects.requireNonNull(temporalUnit,"temporalUnit 不能为空!");
        long between = temporalUnit.between(localDateTime1, localDateTime2);
        return isAbs ? Math.abs(between) : between;
    }

}
